From d9c0d9887184c43565e09aec583b6002b55c41f3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 13 May 2020 07:49:56 +0200 Subject: [PATCH] inspector: Use the monitor list to list monitors --- gtk/inspector/general.c | 141 ++++++++++++++++++++------------------- gtk/inspector/general.ui | 10 +++ 2 files changed, 83 insertions(+), 68 deletions(-) diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index 09afdbb271..7f7f4dcfca 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -68,6 +68,7 @@ struct _GtkInspectorGeneralPrivate GtkWidget *version_box; GtkWidget *env_box; GtkWidget *display_box; + GtkWidget *monitor_box; GtkWidget *gl_box; GtkWidget *vulkan_box; GtkWidget *device_box; @@ -515,10 +516,8 @@ translate_subpixel_layout (GdkSubpixelLayout subpixel) static void populate_display (GdkDisplay *display, GtkInspectorGeneral *gen) { - gint i; GList *children, *l; GtkWidget *child; - int n_monitors; GtkListBox *list; gtk_widget_show (gen->priv->display_composited); @@ -549,63 +548,69 @@ populate_display (GdkDisplay *display, GtkInspectorGeneral *gen) gdk_display_is_rgba (display)); gtk_widget_set_visible (gen->priv->display_composited, gdk_display_is_composited (display)); +} - n_monitors = gdk_display_get_n_monitors (display); - for (i = 0; i < n_monitors; i++) - { - gchar *name; - gchar *value; - GdkRectangle rect; - gint scale; - char *scale_str = NULL; - const char *manufacturer; - const char *model; - GdkMonitor *monitor; - - monitor = gdk_display_get_monitor (display, i); - - name = g_strdup_printf ("Monitor %d", i); - manufacturer = gdk_monitor_get_manufacturer (monitor); - model = gdk_monitor_get_model (monitor); - value = g_strdup_printf ("%s%s%s", - manufacturer ? manufacturer : "", - manufacturer || model ? " " : "", - model ? model : ""); - add_label_row (gen, list, name, value, 0); - g_free (name); - g_free (value); - - gdk_monitor_get_geometry (monitor, &rect); - scale = gdk_monitor_get_scale_factor (monitor); - if (scale != 1) - scale_str = g_strdup_printf (" @ %d", scale); - - value = g_strdup_printf ("%d × %d%s at %d, %d", - rect.width, rect.height, - scale_str ? scale_str : "", - rect.x, rect.y); - add_label_row (gen, list, "Geometry", value, 10); - g_free (value); - g_free (scale_str); - - value = g_strdup_printf ("%d × %d mm²", - gdk_monitor_get_width_mm (monitor), - gdk_monitor_get_height_mm (monitor)); - add_label_row (gen, list, "Size", value, 10); - g_free (value); - - if (gdk_monitor_get_refresh_rate (monitor) != 0) - value = g_strdup_printf ("%.2f Hz", - 0.001 * gdk_monitor_get_refresh_rate (monitor)); - else - value = g_strdup ("unknown"); - add_label_row (gen, list, "Refresh rate", value, 10); - g_free (value); - - value = g_strdup (translate_subpixel_layout (gdk_monitor_get_subpixel_layout (monitor))); - add_label_row (gen, list, "Subpixel layout", value, 10); - g_free (value); - } +static GtkWidget * +populate_monitor (gpointer item, + gpointer gen) +{ + GtkListBox *list; + GdkMonitor *monitor = item; + gchar *name; + gchar *value; + GdkRectangle rect; + gint scale; + char *scale_str = NULL; + const char *manufacturer; + const char *model; + + list = GTK_LIST_BOX (gtk_list_box_new ()); + gtk_list_box_set_selection_mode (list, GTK_SELECTION_NONE); + + /* XXX: add monitor # here when porting to listview */ + name = g_strdup_printf ("Monitor %d", 1); + manufacturer = gdk_monitor_get_manufacturer (monitor); + model = gdk_monitor_get_model (monitor); + value = g_strdup_printf ("%s%s%s", + manufacturer ? manufacturer : "", + manufacturer || model ? " " : "", + model ? model : ""); + add_label_row (gen, list, name, value, 0); + g_free (name); + g_free (value); + + gdk_monitor_get_geometry (monitor, &rect); + scale = gdk_monitor_get_scale_factor (monitor); + if (scale != 1) + scale_str = g_strdup_printf (" @ %d", scale); + + value = g_strdup_printf ("%d × %d%s at %d, %d", + rect.width, rect.height, + scale_str ? scale_str : "", + rect.x, rect.y); + add_label_row (gen, list, "Geometry", value, 10); + g_free (value); + g_free (scale_str); + + value = g_strdup_printf ("%d × %d mm²", + gdk_monitor_get_width_mm (monitor), + gdk_monitor_get_height_mm (monitor)); + add_label_row (gen, list, "Size", value, 10); + g_free (value); + + if (gdk_monitor_get_refresh_rate (monitor) != 0) + value = g_strdup_printf ("%.2f Hz", + 0.001 * gdk_monitor_get_refresh_rate (monitor)); + else + value = g_strdup ("unknown"); + add_label_row (gen, list, "Refresh rate", value, 10); + g_free (value); + + value = g_strdup (translate_subpixel_layout (gdk_monitor_get_subpixel_layout (monitor))); + add_label_row (gen, list, "Subpixel layout", value, 10); + g_free (value); + + return GTK_WIDGET (list); } static void @@ -616,20 +621,14 @@ populate_display_notify_cb (GdkDisplay *display, populate_display (display, gen); } -static void -populate_display_monitor_cb (GdkDisplay *display, - GdkMonitor *monitor, - GtkInspectorGeneral *gen) -{ - populate_display (display, gen); -} - static void init_display (GtkInspectorGeneral *gen) { g_signal_connect (gen->priv->display, "notify", G_CALLBACK (populate_display_notify_cb), gen); - g_signal_connect (gen->priv->display, "monitor-added", G_CALLBACK (populate_display_monitor_cb), gen); - g_signal_connect (gen->priv->display, "monitor-removed", G_CALLBACK (populate_display_monitor_cb), gen); + gtk_list_box_bind_model (GTK_LIST_BOX (gen->priv->monitor_box), + gdk_display_get_monitors (gen->priv->display), + populate_monitor, + gen, NULL); populate_display (gen->priv->display, gen); } @@ -840,6 +839,8 @@ keynav_failed (GtkWidget *widget, GtkDirectionType direction, GtkInspectorGenera else if (direction == GTK_DIR_DOWN && widget == gen->priv->env_box) next = gen->priv->display_box; else if (direction == GTK_DIR_DOWN && widget == gen->priv->display_box) + next = gen->priv->monitor_box; + else if (direction == GTK_DIR_DOWN && widget == gen->priv->monitor_box) next = gen->priv->gl_box; else if (direction == GTK_DIR_DOWN && widget == gen->priv->gl_box) next = gen->priv->vulkan_box; @@ -850,6 +851,8 @@ keynav_failed (GtkWidget *widget, GtkDirectionType direction, GtkInspectorGenera else if (direction == GTK_DIR_UP && widget == gen->priv->vulkan_box) next = gen->priv->gl_box; else if (direction == GTK_DIR_UP && widget == gen->priv->gl_box) + next = gen->priv->monitor_box; + else if (direction == GTK_DIR_UP && widget == gen->priv->monitor_box) next = gen->priv->display_box; else if (direction == GTK_DIR_UP && widget == gen->priv->display_box) next = gen->priv->env_box; @@ -877,6 +880,7 @@ gtk_inspector_general_constructed (GObject *object) g_signal_connect (gen->priv->version_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); g_signal_connect (gen->priv->env_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); g_signal_connect (gen->priv->display_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); + g_signal_connect (gen->priv->monitor_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); g_signal_connect (gen->priv->gl_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); g_signal_connect (gen->priv->vulkan_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); g_signal_connect (gen->priv->device_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); @@ -907,6 +911,7 @@ gtk_inspector_general_class_init (GtkInspectorGeneralClass *klass) gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, version_box); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, env_box); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, display_box); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, monitor_box); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gl_box); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, vulkan_box); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gtk_version); diff --git a/gtk/inspector/general.ui b/gtk/inspector/general.ui index 5b363955da..5c489484ed 100644 --- a/gtk/inspector/general.ui +++ b/gtk/inspector/general.ui @@ -500,6 +500,16 @@ + + + center + + + none + + + + center -- 2.30.2